/*******************************************************************************
  * 文件：KeyDispatch.c
  * 作者：zyz
  * 版本：v1.0.0
  * 日期：2017-08-03
  * 说明：按键分发
*******************************************************************************/

/* 头文件 *********************************************************************/
#include "KeyDispatch.h"
#include "KeyHandler.h"
#include "Macro.h"
#include "DisplayBoard.h"

/* 宏定义 *********************************************************************/
/* 类型定义 *******************************************************************/
/* 变量定义 *******************************************************************/
// 按键回调函数表
static const KeyHandler_ts asHandlerTab[] =
{
    // 左灶定时按键按下
    {u32KEY_VALUE_LEFT_TIMING,  eKEY_TYPE_PRESS_UP,     Key_PressLeftTimingHandler },

    // 中灶定时按键按下
    {u32KEY_VALUE_MID_TIMING,   eKEY_TYPE_PRESS_UP,     Key_PressMidTimingHandler  },

    // 右灶定时按键按下
    {u32KEY_VALUE_RIGHT_TIMING, eKEY_TYPE_PRESS_UP,     Key_PressRightTimingHandler},

    // 左灶定时按键长按2s
    {u32KEY_VALUE_LEFT_TIMING,  eKEY_TYPE_HOLD_2S,      Key_Press2SLeftTimingHandler },
    
    // 中灶定时按键长按2s
    {u32KEY_VALUE_MID_TIMING,   eKEY_TYPE_HOLD_2S,      Key_Press2SMidTimingHandler  },
    
    // 右灶定时按键长按2s
    {u32KEY_VALUE_RIGHT_TIMING, eKEY_TYPE_HOLD_2S,      Key_Press2SRightTimingHandler},

    // 左灶定时按键长按3s
    {u32KEY_VALUE_LEFT_TIMING,  eKEY_TYPE_HOLD_3S,      Key_Press3SLeftTimingHandler },
    
    // 中灶定时按键长按3s
    {u32KEY_VALUE_MID_TIMING,   eKEY_TYPE_HOLD_3S,      Key_Press3SMidTimingHandler  },
    
    // 右灶定时按键长按3s
    {u32KEY_VALUE_RIGHT_TIMING, eKEY_TYPE_HOLD_3S,      Key_Press3SRightTimingHandler},

    // +键按下
    {u32KEY_VALUE_ADD,          eKEY_TYPE_PRESS_UP,     Key_PressAddHandler        },

    // +键连按
    {u32KEY_VALUE_ADD,          eKEY_TYPE_CONTINUE,     Key_ContinuePressAddHandler},

    // -键按下
    {u32KEY_VALUE_SUB,          eKEY_TYPE_PRESS_UP,     Key_PressSubHandler        },

    // -键连按
    {u32KEY_VALUE_SUB,          eKEY_TYPE_CONTINUE,     Key_ContinuePressSubHandler},

    // 左定时长按十秒
    {u32KEY_VALUE_LEFT_TIMING,  eKEY_TYPE_HOLD_10S,     Key_LongPress10SAnyHandler },

    // 中定时长按十秒
    {u32KEY_VALUE_MID_TIMING,   eKEY_TYPE_HOLD_10S,     Key_LongPress10SAnyHandler },

    // 右定时长按十秒
    {u32KEY_VALUE_RIGHT_TIMING, eKEY_TYPE_HOLD_10S,     Key_LongPress10SAnyHandler },

    // 加键长按十秒
    {u32KEY_VALUE_ADD,          eKEY_TYPE_HOLD_10S,     Key_LongPress10SAnyHandler },

    // 减键定时长按十秒
    {u32KEY_VALUE_SUB,          eKEY_TYPE_HOLD_10S,     Key_LongPress10SAnyHandler },
};

/* 函数声明 *******************************************************************/
/* 函数定义 *******************************************************************/

/*******************************************************************************
  * 函数名: void Key_DispatchHandler(U16 u16Value, KeyType_te eType)
  * 功  能：查找处理函数
  * 参  数：U32 u16Value     - 按键值
  *        KeyType_te eType - 按键操作类型
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void Key_DispatchHandler(U32 u32Value, KeyType_te eType)
{
    U8 u8Index = 0;
    // 按键回调函数个数
    static U8 u8HandlerNum = (U8)(ARRAY_SIZE(asHandlerTab));

    // 查找处理函数
    for(u8Index=0; u8Index<u8HandlerNum; u8Index++)
    {
        if((asHandlerTab[u8Index].u32KeyValue == u32Value) &&
           (asHandlerTab[u8Index].eKeyType == eType) &&
           (asHandlerTab[u8Index].pfHandler != NULL))
        {
            // 找到处理函数且函数指针有效，则进行处理
            asHandlerTab[u8Index].pfHandler();
            break;
        }
    }
}

/***************************** 文件结束 ***************************************/
